'''
在OOP程序设计中，当我们定义一个class的时候，可以从某个现有的class继承，新的class称为子类（Subclass），
而被继承的class称为基类、父类或超类（Base class、Super class）。

'''

class Animal:
    def run(self):
        print("Animal is running")

class Dog(Animal):
    def run(self):         # 重写父类的方法
        print("Dog is running")

class Cat(Animal):           # 继承Animal类
    pass                     # 空类，没有任何属性和方法,但可以继承父类的所有方法和属性

# 测试Animal
animal = Animal()
animal.run()
dog = Dog()
dog.run()
cat = Cat()
cat.run()                 # 调用父类的方法

class Plant:
    def fly(self):
        print("Plant not flying")

    def run(self):
        print("植物可不会跑！")

# 继承的另一个好处：多态。即子类可以重写父类的方法。
# 继承的好外，获得了父类的全部功能， 同时还可以添加新的方法或属性，以便满足个性化需求。

# 判断一个变量是否是某个类型可以用isinstance()判断
print(isinstance(dog, Dog))  # True
print(isinstance(cat, Animal))    # True
print(isinstance(dog, Cat))  # False
print(isinstance(animal, Dog))    # False

print("----"*10)
def run_twice(ani):    # 定义一个函数，参数接收的是实例对象，
                   # 形参，可接收任何数据类型，主要看函数体内的操作。 且调用时的实参要对上。
    ani.run()            # 调用实例对象的run()方法
    ani.run()

run_twice(animal)    # 调用父类的方法
run_twice(Dog())       # 调用子类的方法
run_twice(Plant())     #  如类Plant没有run()方法，则去找其父类的方法,都没有run()方法，就会报错。这里Plant中有run方法，则是调用Plant类的run方法，与Animal类无关了。
# run_twice(123)       #     调用int类型，没有run()方法，报错。